package com.cskaoyan.javase.array._5variable;


/**
 * 可变参数的语法
 * [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 *   //方法体
 * }
 * "数据类型... 变量名" 表示对应数据类型的可变参数
 * 可变参数的本质就是对应数据类型的数组,在可变参数的方法体中,直接把它当成数组处理就可以了
 * 有可变参数的方法,在调用时:
 *      1.仍然可以传入对应数据类型的数组(不常见)
 *      2.允许传入不确定个数的对应数据类型的参数(常见)
 *
 * 带有可变参数的方法,在调用时可以传入不确定个数的参数
 * 这些参数在编译器编译代码时,会自动封装成一个数组
 * 这种实现原理不改变,但是编译器/JVM等底层多做事,程序员少做事情,可以节省程序员的精力(偷懒)
 * 这种语法在Java中很多,称之为"语法糖"
 *
 *
 * @since 17:39
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2};
        System.out.println(sum(arr));
        // sum(1,2,3,3)
        System.out.println(sum(1, 2));
        System.out.println(sum(1, 2, 3));
        System.out.println(sum(1, 2, 3, 4));
        System.out.println(sum(1, 2, 3, 4, 5));
    }

    // 需求: 求不确定个数的int类型数据的和
    // public static int sum(int[] arr) {
    //     // 遍历数组求和
    //     int result = 0;
    //     for (int ele : arr) {
    //         result += ele;
    //     }
    //     return result;
    // }

    // 需求: 求不确定个数的int类型数据的和,但是希望能够在传参时,真的随心所欲的输入不确定的参数
    // 这种需求,就需要可变参数来实现
    // 'sum(int...)' is already defined in 'com.cskaoyan.javase.array._5variable.Demo'
    // public static int sum(int... p){
    //     return 0;
    // }

    public static int sum(int... arr) {
        // 遍历数组求和
        int result = 0;
        for (int ele : arr) {
            result += ele;
        }
        return result;
    }

}
